package com.jjiang.bbmall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1. 整合MyBatis-Plus
 * 1.1 导入依赖【mybatis-plus-boot-starter】
 * 1.2 配置
 * 1.2.1 配置数据源
 * 1.2.1.1 导入数据库驱动
 * 1.2.1.2 在application.yml配置数据源
 * 1.2.2 配置MyBatis-Plus
 * 1.2.2.1 使用MapperScan
 * 1.2.2.2 告诉mybatis-plus sql的映射位置
 * <p>
 * 2. 使用逻辑删除
 * 2.1 配置全局的逻辑删除规则
 * 2.2 配置逻辑删除的组件Bean【3.1.0版本后省略】
 * 2.3 为需要逻辑删除的实体类机上逻辑删除注解@TableLogic
 * <p>
 * 3. JSR303
 * 3.1 给Bean添加校验注解:参照javax.validation.constrains，并且定义message提示
 * 3.2 在controller中开启校验功能@Valid，效果：400 Bad Request
 * 3.3 在controller中紧跟BindingResult，得到校验结果
 * 3.4 分组校验->完成多场景的复杂校验
 * 3.4.1 为校验的注解标注groups
 * 3.4.2 为controller加上@Validated(AddGroup.class)
 * 3.4.3 注意！！！未指定group的，将不会被校验！
 * <p>
 * 4. 做统一的异常处理
 * 4.1 使用@ControllerAdvice
 * 4.2 使用@ExceptionHandler标注方法处理异常
 * <p>
 * 5. 自定义校验
 * 5.1 编写自定义校验注解
 * 5.2 编写自定义校验器
 * 5.3 关联自定义校验器和注解【可以一个注解指定多个校验器】
 * <p>
 * 6. 引入模板引擎
 * 6.1 引入thymeleaf-starter，并且在开发期间关闭缓存
 * 6.2 静态资源都放在static文件夹下旧可以按照路径直接访问
 * 6.3 页面放咋爱templates下，直接访问
 * 6.4 SpringBoot默认配置，当访问项目对应端口时，默认会找index.html
 * 6.5 页面修改不重启服务器，可以实时更新
 * 6.5.1 引入thymeleaf-starter，并且在开发期间关闭缓存
 * 6.5.2 导入dev tools
 * 6.5.3 在html页面按 ctrl+f9
 * <p>
 * 7. 引入redis
 * 7.1 引入spring-boot-data-redis-starter
 * 7.2 在application.yml进行简单配置
 * 7.3 使用SpringBoot自动配置好的RedisTemplate/stringRedisTemplate进行操作
 * <p>
 * 8.引入redisson作为分布式锁等功能框架
 * 8.1 引入redisson
 * 8.2 配置
 * <p>
 * 9.整合SpringCache的Redis缓存作为缓存
 * 9.1 引入SpringCache依赖
 * 9.2 引入Redis以来
 * 9.3 配置使用redis作为缓存
 * 9.4 对主类使用@EnableCaching开启缓存
 * 9.5 堆方法使用@Cacheable({"category"})，对改方法的数据进行缓存【需要指定缓存名称】
 * 9.5.1 如果缓存中有数据，则不会调用改方法
 * 9.5.2 key为自动生成的
 * 9.5.3 缓存的value为jdk序列化之后的数据
 * 9.5.4 默认ttl时间为-1
 * 9.6 自定义设置
 * 9.6.1 指定key，直接注解中指定
 * 9.6.2 指定ttl，配置文件指定
 * 9.6.3 指定value数据以JSON保存，自己实现配置类
 */
@EnableRedisHttpSession
@EnableDiscoveryClient
@MapperScan("com.jjiang.bbmall.product.dao")
@SpringBootApplication
@EnableFeignClients(basePackages = "com.jjiang.bbmall.product.feign")
public class BbmallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(BbmallProductApplication.class, args);
    }

}
